package org.example.repository;

import com.github.pagehelper.Page;
import dto.ExceptionTrackingQueryDTO;
import dto.InspectionQualityQueryDTO;
import dto.StandardQuaryDTO;
import entity.ExceptionTracking;
import entity.InspectionMaterial;
import entity.QualityInspection;
import entity.QualityStandard;
import org.springframework.stereotype.Repository;
import vo.QualityInspectionVo;

import java.util.List;
import java.util.Map;

/**
 * 质量经理数据访问接口
 */
@Repository
public interface QualityManagerRepository {

    /**
     * 查询质检单
     * @param queryDTO 查询参数
     * @return 质检单列表
     */
    Page<QualityInspectionVo> queryQualityInspection(InspectionQualityQueryDTO queryDTO);

    /**
     * 查询质检单总数
     * @param queryDTO 查询参数
     * @return 总数
     */
    Integer countQualityInspection(InspectionQualityQueryDTO queryDTO);

    /**
     * 更新质检单
     * @param qualityInspection 质检单信息
     */
    void updateQualityInspection(QualityInspection qualityInspection);

    /**
     * 根据质检单ID列表查询质检单
     * @param inspectionIds 质检单ID列表
     * @return 质检单列表
     */
    List<QualityInspection> queryQualityInspectionByIds(List<Integer> inspectionIds);

    /**
     * 查询质量标准
     * @param queryDTO 查询参数
     * @return 质量标准列表
     */
    List<QualityStandard> queryQualityStandard(StandardQuaryDTO queryDTO);

    /**
     * 查询质量标准总数
     * @param queryDTO 查询参数
     * @return 总数
     */
    Integer countQualityStandard(StandardQuaryDTO queryDTO);

    /**
     * 获取质量合格率统计
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param inspectionType 检验类型
     * @param supplier 供应商
     * @param defectType 缺陷类型
     * @return 合格率统计数据
     */
    Map<String, Object> getQualityPassRateStats(String startDate, String endDate, String inspectionType, String supplier, String defectType);

    /**
     * 获取缺陷类型分布
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param inspectionType 检验类型
     * @param supplier 供应商
     * @return 缺陷类型分布数据
     */
    List<Map<String, Object>> getDefectTypeDistribution(String startDate, String endDate, String inspectionType, String supplier);

    /**
     * 获取原材料合格率趋势
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param supplier 供应商
     * @param defectType 缺陷类型
     * @return 原材料合格率趋势数据
     */
    List<Map<String, Object>> getRawMaterialPassRateTrend(String startDate, String endDate, String supplier, String defectType);

    /**
     * 获取半成品合格率趋势
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param supplier 供应商
     * @param defectType 缺陷类型
     * @return 半成品合格率趋势数据
     */
    List<Map<String, Object>> getSemiFinishedPassRateTrend(String startDate, String endDate, String supplier, String defectType);

    /**
     * 获取成品合格率趋势
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param supplier 供应商
     * @param defectType 缺陷类型
     * @return 成品合格率趋势数据
     */
    List<Map<String, Object>> getFinishedProductPassRateTrend(String startDate, String endDate, String supplier, String defectType);
    
    /**
     * 获取综合合格率
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param inspectionType 检验类型
     * @param supplier 供应商
     * @param defectType 缺陷类型
     * @return 综合合格率数据
     */
    Map<String, Object> getOverallPassRate(String startDate, String endDate, String inspectionType, String supplier, String defectType);
    
    /**
     * 获取不合格批次总数
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param inspectionType 检验类型
     * @param supplier 供应商
     * @param defectType 缺陷类型
     * @return 不合格批次总数
     */
    Integer getUnqualifiedCount(String startDate, String endDate, String inspectionType, String supplier, String defectType);

    // 异常追踪
    Page<ExceptionTracking> queryExceptionTrackings(ExceptionTrackingQueryDTO queryDTO);
    // 获取异常表数据量总数
    Integer dataCount();

    //查看异常详情
    ExceptionTracking getExceptionTrackingByNum(String exceptionNumber);

    //折线图呈现各异常每月出现数量
    Map<String,Object> getExceptionTrackingTrend();

    /**
     * 根据供应商ID查询供应商信息
     * @param supplierId 供应商ID
     * @return 供应商信息
     */
    entity.Supplier getSupplierById(Integer supplierId);

}